#include "mainwindow.h"
#include "plugininterface.h"
#include <QVBoxLayout>
#include <QMessageBox>
#include <QCoreApplication>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    setWindowTitle("Qt Plugin 示例");
    setGeometry(100, 100, 800, 600);
    
    // 初始化共享变量
    sharedVariable = "这是从主窗口共享的变量";
    
    tabWidget = new QTabWidget(this);
    setCentralWidget(tabWidget);
    
    loadPlugins();
}

MainWindow::~MainWindow()
{
    qDebug() << "开始清理插件资源";
    // 清理插件对象
    foreach (QObject* plugin, loadedPlugins) {
        if (plugin) {
            qDebug() << "删除插件对象";
            plugin->deleteLater();
        }
    }
    loadedPlugins.clear();
    qDebug() << "插件资源清理完成";
}

void MainWindow::loadPlugins()
{
    qDebug() << "开始加载插件";
    // 从应用程序目录开始
    QDir pluginsDir("C:/Users/26938/Desktop/code/Plugin2");
    qDebug() << "插件目录路径:" << pluginsDir.absolutePath();
    
    // 切换到plugins目录
    if (!pluginsDir.cd("plugins")) {
        qDebug() << "无法切换到plugins目录";
        QMessageBox::warning(this, "警告", "无法切换到plugins目录: " + pluginsDir.absolutePath());
        return;
    }
    
    qDebug() << "当前插件目录:" << pluginsDir.absolutePath();
    
    // 确保plugins目录存在
    if (!pluginsDir.exists()) {
        qDebug() << "plugins目录不存在，尝试创建";
        // 如果不存在，尝试创建
        if (!QDir().mkpath(pluginsDir.absolutePath())) {
            QMessageBox::warning(this, "警告", "无法创建plugins目录: " + pluginsDir.absolutePath());
            return;
        }
    }
    
    qDebug() << "列出插件目录中的文件:";
    foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
        qDebug() << "发现文件:" << fileName;
        // 只处理DLL文件（Windows）
        if (!fileName.endsWith(".dll")) {
            qDebug() << "跳过非DLL文件:" << fileName;
            continue;
        }
        
        QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
        qDebug() << "尝试加载插件:" << fileName;
        
        QObject *plugin = pluginLoader.instance();
        if (!plugin) {
            qDebug() << "插件加载失败:" << pluginLoader.errorString();
            continue;
        }
        
        qDebug() << "插件加载成功";
        
        // 保存插件对象引用
        loadedPlugins.append(plugin);
        
        PluginInterface *pluginInterface = qobject_cast<PluginInterface *>(plugin);
        if (!pluginInterface) {
            qDebug() << "插件接口转换失败";
            continue;
        }
        
        qDebug() << "插件接口转换成功，插件名称:" << pluginInterface->name();
        
        try {
            // 先创建插件界面，这样infoLabel就会被初始化
            QWidget *widget = pluginInterface->createWidget(this);
            if (widget) {
                // 然后再设置共享值
                pluginInterface->setSharedValue(sharedVariable);
                
                tabWidget->addTab(widget, pluginInterface->name());
                qDebug() << "成功添加插件界面到标签页";
            } else {
                qDebug() << "创建插件界面失败";
            }
        } catch (const std::exception &e) {
            qDebug() << "插件操作异常:" << e.what();
        } catch (...) {
            qDebug() << "插件操作未知异常";
        }
    }
    
    if (tabWidget->count() == 0) {
        QMessageBox::information(this, "信息", "未找到任何插件，请确保插件已正确编译并放在plugins目录中。\n插件目录: " + pluginsDir.absolutePath());
    }
    qDebug() << "插件加载完成";
}
